<?php
/**
* @todo comentar bien el codigo para que salgan el quick help en el editor
*/
require_once "interface/Gi_Controller_Interface.php";
require_once "Gi_View.php";
require_once "Gi_Request.php";
class Gi_Controller_Abstract implements Gi_Controller_Interface{
  public $view;
  public $request;
  /**
  * @var Gi_Controller_Front
  */
  private $_front_controller;
  
  
  public function __construct (Gi_Request_Interface $request){
    $this->_front_controller = Gi_Controller_Front::get_instance();
    $this->request = $request;
    $this->init_view();   
    $this->init();
  }
  
  public function  init () {
  }
  
  public function init_view() {
    $view = new Gi_View();
    if ($this->request->get_module()) {
      $view_dir = $this->_front_controller->get_app_dir() . DIRECTORY_SEPARATOR . $this->request->get_module() . DIRECTORY_SEPARATOR . $this->_front_controller->set_view_dir();
    }
    else {
      $view_dir = $this->_front_controller->get_app_dir() . DIRECTORY_SEPARATOR . $this->_front_controller->set_view_dir();
    }
    $view->set_script_path($view_dir);
    $this->view = $view;
  }
  
  public function pre_dispatch () {
  }
  
  public function dispatch ($method) {
    if (method_exists($this,$method))
      $this->$method();
    else
      throw new Exception("El metodo: $method no existe");
  }
  
  public function post_dispatch () {
  }
  
  /**
  * @desc funcion para llamar a otro action a otro controller o a otro modulo
  */
  public function forward($action, $controller=null, $module=null, $params = array()) {
    $this->request->set_despatched(false);
    if ($module !== null) {
      $this->request->set_module($module);
    }
    if ($controller !== null) {
      $this->request->set_controller($controller);
    }
    $this->request->set_action($action);
    $this->request->set_params($params);
  }
  
  /**
  * @desc esta funcion solo sirve para hacer redirects por url
  * @todo tiene un bug por la forma en la que se procesan los actions si la funcion es utilizada en el init o en el predispatch y redirecciona sobre el mismo controller la aplicacion entra en un bucle de redirects
  */
  public function redirect($file) {
    $host = $_SERVER['HTTP_HOST'];
    $uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
    if ($file === '/' )
      header('Location: http://' . $host . $uri . '/');
    else 
      header('Location: http://' . $host . $uri . '/' . $file);
    exit();
  }   
  
  public function url_redirect ($url) {
    header('Location: http://' . $url );
  }
}
?>
